library(rmarkdown)
library(tidyverse) # pour %>%
library(kableExtra) # kbl
library(knitr) # kable
library(ggplot2)
library(plotly) # graphes dynamiques
library(MASS)
library(corrplot) # corrplot
library(GGally) # ggpairs
library(gridExtra) # co-plot pour ggplotTélécharger le jeu de données EPO modifié et nommer le
mydata.
Transformer la nature des variables nécessaires.
mydata$sexe<-as.factor(mydata$sexe)
mydata$taille<-as.numeric(mydata$taille)
mydata$Score<-as.factor(mydata$Score)
mydata$niveau<-ordered(mydata$niveau,levels=c("L1_2","L3","M1_2"))
str(mydata)## 'data.frame': 38 obs. of 6 variables:
## $ sexe : Factor w/ 2 levels "F","H": 1 1 1 1 1 1 1 1 1 1 ...
## $ age : int 22 20 25 34 20 19 18 21 21 21 ...
## $ taille : num 1.7 1.66 1.65 1.62 1.66 1.64 1.61 1.63 1.63 1.65 ...
## $ niveau : Ord.factor w/ 3 levels "L1_2"<"L3"<"M1_2": 2 2 3 3 2 1 2 2 2 2 ...
## $ scoreConnaissance: int 3 3 1 3 2 1 1 2 3 3 ...
## $ Score : Factor w/ 3 levels "=3","inf à 3",..: 1 1 2 1 2 2 2 2 1 1 ...
Pour alléger les écritures, procédons à des copies de nos variables
Soit une population \(\mathcal P\) de taille \(n\), on s’intéresse maintenant à deux caractères, le caractère \(X\) et le caractère \(Y\).
Série statistique bivariée \((x_1,y_1),\cdots,(x_n,y_n)\): A chaque individu \(i\) de la population, on observe \((x_i,y_i)\).
Modalités Valeurs distinctes prises par la série. Notons
Pour \(j=1,\cdots,J\), on note \(m^X_{j}\) les modalités de \(X\) et \(n_{j\cdot}\) l’effectif de \(m^X_{j}\).
Pour \(k=1,\cdots,K\), on note \(m^Y_{k}\) les modalités de \(Y\) et \(n_{\cdot k}\) l’effectif de \(m^Y_{k}\).
Pour \(k=1,\cdots,K\) et \(j=1,\cdots,J\) on note \(n_{j k}\), l’ effectif croisé des modalités \((m^X_{j},m^Y_{k})\).
📌 Si l’une des deux variables (ou les deux) est quantitative continue, remplacer respectivement par des classes!
Tableau de contingence:
Tableau à double entrées : effectifs croisés \(n_{jk}\)
| L1_2 | L3 | M1_2 | |
|---|---|---|---|
| F | 5 | 16 | 2 |
| H | 1 | 12 | 2 |
Tableau des fréquences/Distribution empirique jointe:
Tableau à double entrées : fréquences croisés \(f_{jk}\in(0,1)\)
| L1_2 | L3 | M1_2 | |
|---|---|---|---|
| F | 0.1315789 | 0.4210526 | 0.0526316 |
| H | 0.0263158 | 0.3157895 | 0.0526316 |
Tableaux des fréquences marginales /distributions marginales:
Tableaux des fréquences marginales \(f_{j\cdot}\in(0,1)\) et \(f_{\cdot k}\in(0,1)\)
| sexe | Freq |
|---|---|
| F | 0.6052632 |
| H | 0.3947368 |
| niveau | Freq |
|---|---|
| L1_2 | 0.1578947 |
| L3 | 0.7368421 |
| M1_2 | 0.1052632 |
Tableaux des fréquences conditionnelles :
Profils colonnes (\(Y/X\)) :Tableau des distibutions empiriques conditionnelles de \(\left(Y=m^Y_k/m^X_j\right)_{k=1,\cdots,K}\): chaque colone \(k\) correspond à la distribution conditionnelle de \(Y=m^Y_k/m^X_j\) \[f_{k | j} = \frac{f_{jk}}{f_{j\cdot}}.\]
Profils lignes (\(X/Y\)) Tableau des distibutions empiriques conditionnelles de \(\left(X=m^X_j/Y=m^Y_k\right)_{j=1,\cdots,J}\): chaque ligne \(j\) correspond à la distribution conditionnelle de \(X=m^X_j/Y=m^Y_k\) \[f_{j | k} = \frac{f_{jk}}{f_{\cdot k}}.\]
| L1_2 | L3 | M1_2 | |
|---|---|---|---|
| F | 0.8333333 | 0.5714286 | 0.5 |
| H | 0.1666667 | 0.4285714 | 0.5 |
| L1_2 | L3 | M1_2 | |
|---|---|---|---|
| F | 0.2173913 | 0.6956522 | 0.0869565 |
| H | 0.0666667 | 0.8000000 | 0.1333333 |
Afficher le tableau de la distribution empirique jointe des variables
(sexe,Score).
| =3 | inf à 3 | sup à 3 | |
|---|---|---|---|
| F | 0.2631579 | 0.2631579 | 0.0789474 |
| H | 0.1315789 | 0.1052632 | 0.1578947 |
Afficher le tableau des distributions empiriques marginales des
variables sexe et Score.
| sexe | Freq |
|---|---|
| F | 0.6052632 |
| H | 0.3947368 |
| Score | Freq |
|---|---|
| =3 | 0.3947368 |
| inf à 3 | 0.3684211 |
| sup à 3 | 0.2368421 |
Afficher le tableau des profils colonnes et des profils lignes pour
les variables sexe et Score.
💡 Bon à savoir !
La commande tapply permet de calculer un indicateurs
(moyennes, des écarts types,…) d’une variable quantitative \(X\) en fonction des modalités d’un ou deux
facteurs. tapply(X,facteur,indicateur)
| x | |
|---|---|
| L1_2 | 19.66667 |
| L3 | 21.17857 |
| M1_2 | 26.00000 |
| L1_2 | L3 | M1_2 | |
|---|---|---|---|
| F | 19.8 | 20.68750 | 29.5 |
| H | 19.0 | 21.83333 | 22.5 |
Tests:
\(H_0\): Pas de lien vs \(H_1\) :Lien
Tests paramétriques (TP) : puissants mais pas toujours possibles (sous conditions).
Tests non-paramétriques (TNP) : moins puissants mais les conditions d’application sont moins strictes.
📌 Bon à savoir !
\(p\)-value petite \(\Rightarrow\) rejet de \(H_0\) donc Lien
\(p\)-value grande \(\Rightarrow\) non rejet de \(H_0\) donc Pas de lien
##
## Fisher's Exact Test for Count Data
##
## data: sexe and niveau
## p-value = 0.5443
## alternative hypothesis: two.sided
👀 Grande \(p\)-value, non rejet d’\(H_0\) donc pas de lien.
Qualitative \(F1\) & qualitative \(F2\)
Test exact de Fisher (TNP). \(\ H_0\): Indépendance vs \(H_1\) : dépendance.
Command R : fisher.test(F1,F2)
##
## Fisher's Exact Test for Count Data
##
## data: sexe and niveau
## p-value = 0.5443
## alternative hypothesis: two.sided
👀 Grande \(p\)-value, non rejet d’\(H_0\) donc pas de lien.
Qualitative \(F\) (2 modalités) & numérique \(X\)
Test de Wilcoxon (TNP). \(\ H_0\): \(median_1=median_2\) vs \(H_1\) : \(\overline{H_0}\).
Command R : wilcox.test(X ~ F)
##
## Wilcoxon rank sum test with continuity correction
##
## data: taille by sexe
## W = 6, p-value = 6.51e-07
## alternative hypothesis: true location shift is not equal to 0
👀 Petite \(p\)-value, rejet d’\(H_0\), il existe un lien.
Qualitative \(F\) (3 modalités) & numérique \(X\)
Test de Kruskal-Wallis (TNP). \(\ H_0\): \(median_i\) égales vs \(H_1\) : \(\overline{H_0}\).
Command R : kruskal.test(X ~ F)
##
## Kruskal-Wallis rank sum test
##
## data: age by niveau
## Kruskal-Wallis chi-squared = 12.191, df = 2, p-value = 0.002252
👀 Petite \(p\)-value, rejet d’\(H_0\), il existe un lien.
Numérique \(X\) & numérique \(Y\)
Test de Spearman (corrélation). \(\ H_0\): \(corr_{X,Y}=0\) vs \(H_1\) : \(\overline{H_0}\).
Command R :
cor.test(X,Y,method="spearman")
##
## Spearman's rank correlation rho
##
## data: age and taille
## S = 7844.8, p-value = 0.3964
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.1416105
👀 Grande \(p\)-value, non rejet d’\(H_0\), il n’existe pas de lien.
Existe-t-il un lien entre les variables qualitatives
Score et niveau? Faire un test.
##
## Fisher's Exact Test for Count Data
##
## data: Score and niveau
## p-value = 0.8311
## alternative hypothesis: two.sided
👀 Grande \(p\)-value, non rejet d’\(H_0\) donc pas de lien.
Existe-t-il un lien entre la variable quantitative age
et la variable qualitative sexe? Faire un test.
##
## Wilcoxon rank sum test with continuity correction
##
## data: age by sexe
## W = 106.5, p-value = 0.04496
## alternative hypothesis: true location shift is not equal to 0
👀 Petite \(p\)-value, rejet d’\(H_0\) donc lien.
Existe-t-il un lien entre la variable quantitative age
et la variable qualitative Score? Faire un test.
##
## Kruskal-Wallis rank sum test
##
## data: age by Score
## Kruskal-Wallis chi-squared = 1.1904, df = 2, p-value = 0.5515
👀 Grande \(p\)-value, non rejet d’\(H_0\) donc pas de lien.
Existe-t-il un lien entre la variable quantitative age
et la variable qualitative scoreNum? Faire un test.
##
## Spearman's rank correlation rho
##
## data: age and scoreNum
## S = 7952.9, p-value = 0.4374
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.1297848
👀 Grande \(p\)-value, non rejet d’\(H_0\) donc pas de lien.
Qualitative \(F1\) & Qualitative \(F2\): Comparaison par diagrammes en barres de 2 facteurs.
Qualitative \(F\) & Numérique \(X\):
Comparaison par histogramme: Histogramme de \(X\) suivant les modalités de \(F\).
Comparaison par boxplots: Boxplots de \(X\) suivant les modalités de \(F\).
Diagramme en barres: Comparaison d’un indicateur (moyenne, écart type,…) de \(X\) suivant les modalités de \(F\)
plot_ly(x = age, color = sexe,type = 'histogram', nbinsx = 5) %>%
layout(xaxis = list(title = 'Taille'),yaxis = list(title = 'Effectif'))plot_ly(y = tapply(taille,sexe,sd),x=levels(sexe), type = 'bar',marker = list(color =c( "cyan","blue"))) %>%
layout(xaxis = list(title = 'Taille'),yaxis = list(title = 'Ecart type'))Afficher les boxplots de la variable age suivant les
modalités de la variable Score.
Comparer l’age moyen des participants suivant leur
niveau via une représentation graphique.
Numérique \(X\) & Numérique \(Y\):
La fonction corrplotde la librairie
corrplotpermet une visualisation 2 à 2 des corrélations :
Uniquement pour les variables numériques.
Pour aller plus loin La fonction
ggpairsde la librairie GGally affiche une
visualisation 2 à 2 des des variables. Il est possible de choisir une
variables catégorielles pour faire ces représentations en fonction des
modalités de cette dernière.
library(corrplot)
Data_numerique<-mydata[,c(2,3,5)]
correlation_matrix<-cor(Data_numerique)
corrplot(correlation_matrix, method="ellipse", type = "upper",addCoef.col = "black")Numérique \(X\) & Numérique \(Y\):
Une reprensentation visuelle de \(Y\) par rapport à \(X\) est le nuage de points.
Auquel on peut ajouter la courbe \(f\) la plus proche de tous les points \[ y=\left\{\begin{array}{ll} f(x)=ax+b & \text{la droite des moindres carrés}\\ f(x)& \text{estimé de façon non paramétrique}\\ \end{array} \right. \]
Fonction ggplot()
de R
ggplot(mydata) : crée une fenêtre et appelle le jeu
de donnée
ggplot(mydata)+ aes(x = age, y =taille,color=sexe) :
crée deux axes: un axe des abscisses nommé age et un axe
des ordonnées nommé taille
Ajouter+ geom_point(): affiche des points de
coordonnées \(x_i=`age_i`\) et \(y_i=`taille_i`\)
Ajouter + geom_smooth() ajoute le tracé de la
fonction la plus “proche” de tous les
points
Ajouter + geom_smooth(method = "lm") ajoute le tracé
de la droite affine la plus “proche” de tous
les points, c’est la droite des moindres carrées.
l’option se = FALSE permet de ne pas afficher
l’intervalle de confiance autour de la droite.
p1<-ggplot(mydata)+ aes(x = age, y =taille)
p2<-p1+ geom_point(col='red', size = 0.5)
p3<-p2+ geom_smooth(se = FALSE)
p4<-p2+ geom_smooth(method = "lm",se = FALSE)
# library(gridExtra) si on ne veut pas de graphes interactifs
#grid.arrange(p1,p2, p3, p4, ncol = 2)
# Comme subplot de la library(plotly) permet de rendre ces 4 plots intéractifs
subplot(p1,p2, p3, p4, nrows = 2)Numérique \(X\) & Numérique \(Y\) & Qualitative \(F\):
Pour une reprensentation visuelle en Nuages de points \((X,Y)\) par modalités d’un facteur \(F\)
il suffit de préciser précisé color=F ici:
ggplot(mydata)+ aes(x = X, y =Y,color=F)+ geom_point()
Ainsi les points sont colorés en fonction des modalités du facteur
donné, ici sexe
p1 <- ggplot(mydata) + aes(x = age, y = taille, color = sexe) + geom_point(size = 0.5)
p2 <- p1 + geom_smooth(aes(x = age, y = taille), se = FALSE)+guides(color = FALSE)
p4 <- p1 + geom_smooth(aes(x = age, y = taille), method = "lm",se = FALSE)
subplot(p2, p4, nrows = 1) %>%
layout(title = "Taille en fonction de l'age et genre",
xaxis = list(title = "Age"),
yaxis = list(title = "Taille"))Dessiner le nuage de points
(age,scoreConnaissance).Afficher la droite des
moindres carrées.
ggplot(mydata)+ aes(x = age, y =scoreConnaissance)+ geom_point(col='red', size = 0.5)+ geom_smooth(method = "lm",se = FALSE)Dessiner les 3 nuages de points
(age,scoreConnaissance) par modalités de la
variable niveau. Afficher les 3 droites des moindres
carrées.